package com.github.mongorest.util; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.annotation.Required; import org.springframework.beans.factory.config.AbstractFactoryBean; import com.github.mongorest.util.Utils.StringUtils; import com.mongodb.DB; import com.mongodb.Mongo; import com.mongodb.MongoException; import com.mongodb.MongoOptions; import com.mongodb.ServerAddress; public class MongoFactoryBean extends AbstractFactoryBean<Mongo> { private Logger logger = LoggerFactory.getLogger(MongoFactoryBean.class); private List<ServerAddress> replicaSetSeeds = new ArrayList<ServerAddress>(); private MongoOptions mongoOptions; private Configuration configuration; @Override public Class<?> getObjectType() { return Mongo.class; } protected DB createDB() throws Exception { DB db = createInstance().getDB(configuration.getDataStoreName()); if (!StringUtils.isNullOrEmpty(configuration.getDataStoreUsername()) && !StringUtils.isNullOrEmpty(configuration.getDataStorePassword())) { db.authenticate(configuration.getDataStoreUsername(), configuration.getDataStorePassword().toCharArray()); } return db; } protected Mongo createInstance() throws Exception { Mongo mongo = null; if (mongoOptions == null) { mongoOptions = new MongoOptions(); mongoOptions.safe = true; // mongoOptions.fsync = true; // mongoOptions.slaveOk = true; } setMultiAddress(configuration.getDataStoreReplicas().split(",")); logger.debug("Created Mongo with MongoOptions: [" + mongoOptions.toString() + "], ReplicaSets: " + replicaSetSeeds); try { if (replicaSetSeeds.size() > 0) { if (mongoOptions != null) { mongo = new Mongo(replicaSetSeeds, mongoOptions); } else { mongo = new Mongo(replicaSetSeeds); } } else { mongo = new Mongo(); } } catch (MongoException mongoException) { logger.error("Problem creating Mongo instance", mongoException); throw mongoException; } return mongo; } public void setMultiAddress(String[] serverAddresses) { replSeeds(serverAddresses); } private void replSeeds(String... serverAddresses) { try { replicaSetSeeds.clear(); for (String addr : serverAddresses) { String[] a = addr.split(":"); String host = a[0].trim(); if (a.length > 2) { throw new IllegalArgumentException("Invalid Server Address : " + addr); } if (a.length == 2) { attemptMongoConnection(host, Integer.parseInt(a[1].trim())); } else { attemptMongoConnection(host, Integer.MIN_VALUE); } } } catch (Exception e) { throw new BeanCreationException("Error while creating replicaSetAddresses", e); } } private void attemptMongoConnection(String host, int port) throws Exception { try { if (port == Integer.MIN_VALUE) { replicaSetSeeds.add(new ServerAddress(host)); } else { replicaSetSeeds.add(new ServerAddress(host, port)); } } catch (UnknownHostException unknownHost) { throw unknownHost; } } public void setAddress(String serverAddress) { replSeeds(serverAddress); } @Required public void setConfiguration(Configuration configuration) { this.configuration = configuration; } }